package optional;

import bean.Student;

import java.util.Optional;

/**
 * @author lyy
 * @date 2021/12/21
 */
public class OptionalTest {
    public static void main(String[] args) throws Exception {
        String str = "abc";
        Optional<Object> empty = Optional.empty();
        Optional<String> str1 = Optional.of(str);
        Optional<String> str2 = Optional.ofNullable(str);
        // isPresent()：是否为null
        boolean present = str2.isPresent();
        if(present){
            System.out.println("str 的值不为 null");
        }else{
            System.out.println("str 的值为 null");
        }
        // ifPresent()：如果不为null，就执行Consumer
        Student student = Student.build();
        Optional.ofNullable(student).ifPresent(stu -> {
            System.out.println(stu.getName());
        });

        String noVal = "empty";
        // get()：获取值，如果值为 null 抛出异常
        String get = Optional.ofNullable(noVal).get();
        System.out.println(get);
        // orElse()：如果Optional有值就将其返回，否则返回 orElse 方法传入的参数
        Object orElse = Optional.ofNullable(noVal).orElse("初始化值");
        System.out.println(orElse);
        // orElseGet()：与 orElse 的区别就是，orElseGet 方法传入的参数为一个 Supplier 接口的实现；当Optional为null的时候，就返回从Supplier获得的值
        String orElseGet = Optional.ofNullable(noVal).orElseGet(() -> {
            int i = 2;
            int j = 3;
            return String.valueOf(i * j);
        });
        System.out.println(orElseGet);
        // orElseThrow()：如果值为 null 就抛出一个异常
        Optional.ofNullable("null").orElseThrow(()->new Exception("值为空"));

        // filter()：过滤数据，返回符合条件的数据
        Optional<Student> student2 = Optional.ofNullable(student).filter(stu -> stu.getAge() > 0);
        System.out.println(student2.isPresent());
        // map()：返回函数的输出值
        String name = Optional.ofNullable(student).map(Student::getName).get();
        System.out.println(name);
        // flatMap()：与map的区别就是，要求参数中的函数输出的就是Optional
        String name1 = Optional.ofNullable(student).flatMap(stu -> Optional.of(stu.getName())).get();
        System.out.println(name1);
    }

}
